/*******************************************************************/
/* @ All Rights Reserved Copyright (C) 2014 broada,Co.,Ltd.        */
/*                                                                 */
/*  NAME      = rtcp_core.h                                        */
/*  NOTE      =                                                    */
/*  DATE      = 2015/07/20 by songbb                               */
/*******************************************************************/

#ifndef __RTCP_CORE_H_
#define __RTCP_CORE_H_

#include <frreport_comm.h>
#include "frlist.h"
#include "frhash2.h"
#include "frstr.h"

#include "conntrack.h"
#include "module.h"
#include "frbyte_buffer.h"

typedef enum __em_rtcp_pt {
    RTCP_PT_FIR = 192,
    RTCP_PT_NACK,
    RTCP_PT_SMPTETC,
    RTCP_PT_IJ,
    RTCP_PT_SR = 200,
    RTCP_PT_RR,
    RTCP_PT_SDES,
    RTCP_PT_BYE,
    RTCP_PT_APP,
    RTCP_PT_RTPFB,
    RTCP_PT_PSFB,
    RTCP_PT_XR,
    RTCP_PT_AVB,
    RTCP_PT_RSI,
    RTCP_PT_TOKEN
} Rtcp_PT;

/*
 * L7session_rtcp 用于存放RTCP私有的session数据，对应L7_session的p_session_private变量
 */
typedef struct __st_L7session_rtcp
{
    unsigned long long ull_error_nums;
    struct timeval st_timestamp;
} L7session_rtcp;

/**
 * RTCP数据包结构体
 */
typedef struct __st_L7_rtcp_packet
{
    Frbyte_Packet *p_st_packet;         /* 组包完成的数据 */
    int i_is_req;
    struct timeval st_timestamp_first;  /* 第一个请求的分片包的时间 */
    struct timeval st_timestamp_last;   /* 最后一个请求的分片包的时间 */
} L7_rtcp_packet;

/**
 * RTCP私有结构体
 */
typedef struct __st_L7session_rtcp_private
{
    L7session_rtcp *p_st_sess;            /* session数据 */
    L7_rtcp_packet *p_st_rtcp_packet;     /* 当前处理中的RTCP数据包 */
    L7_session *p_st_session;             /* 指向父级的L7_session结构体 */
} L7session_rtcp_private;

int rtcp_detect(Conntrack *p_st_conn
            , Apm_packet *p_st_data_in);

int rtcp_analyze(Conntrack *p_st_conn
                , Apm_packet *p_st_data_in
                , Frhash_header *p_st_hash_report);

int rtcp_session_destroy(void *p_st_session_private_in);

#endif
